package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.Employee;
import com.itheima.reggie.service.EmployeeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

/**
 * @author ：李小虎
 * @date ：Created in 2022年07月14日
 * @description ：
 * @version: 1.0
 */
@RestController
@Slf4j
@RequestMapping("/employee")
/**
 * 完善登录处理器
 *      请求数据在请求体中 json格式 一般有两种接收方式
 *         Map map
 *    @RequestBody 实体类
 * @RequestBody 注解作用: 把请求体中json格式数据转换成对象
 *      底层是调用的 set方法   (如果实体类没有set方法 这个注解就没有办法使用  通过set方法吧username和password设置到实体类属性中)
 */
public class EmployeeController {
    @Autowired  //注入的是实现类对象，接收的接口；理解为多态；（Controller–Service–ServiceImpt–Mapper）
    //那么在Service接口有多个ServiceImpt实现类的情况，就需要指定参数名来选择哪个ServiceImpt实现类了。

    //
    private EmployeeService employeeService;//我们想用的是接口中的方法,而不是某个具体的实现类.
/**
 * 接收json格式 一般有两种接收方式
 * Map map
 * @RequestBody  实体类   把请求中的json格式数据转化成对象
 * 底层调用set方法
 */
@PostMapping("/login")
public R<Employee> login(@RequestBody Employee employee, HttpServletRequest request){
    log.info("用户开始登陆了,登陆信息:"+employee);
    //1.获取到页面传递用户名和密码
    String username = employee.getUsername();
    String password = employee.getPassword();
    //2.将密码进行md5加密
    password = DigestUtils.md5DigestAsHex(password.getBytes());
    //3.根据用户名查询用户信息
    //查询
    LambdaQueryWrapper<Employee> wrapper=new LambdaQueryWrapper<>();
    wrapper.eq(Employee::getUsername,username);
    Employee emp = employeeService.getOne(wrapper);
    //4.不存在这个用户,返回登陆失败
    if (emp==null){
        return R.error("账户与密码不匹配,请重新输入");
    }
    //5.存在  就使用查询出来的密码和录入加密后的密码比对
    if (!emp.getPassword().equals(password)){
        return R.error("账户与密码不匹配,请重新输入");
    }
    //6.比对结果正确 查看员工状态
    // 如果状态是0 说明被禁用 提示找管理员 结束登陆
    if (emp.getStatus()==0){
        return R.error("该账户被禁用,请联系管理员解封");
    }
    //7.是1 可以登录 就把用户id存到Session中
  request.getSession().setAttribute("employee",emp.getId());
    //8.返回结果
    return R.success(emp);

}
@PostMapping("/logout")
public R<String> logout(HttpServletRequest request){
    //删除Session中的数据
    request.getSession().removeAttribute("employee");
    return R.success("退出成功");
}
}
